"""
读取 ./files/中东.xlsx, 文件有三个sheet, 每份文档的格式都是相同的:
|地图坐标|公司名称|行业|地址|电话|网址|国家|是否有WhatsApp|备注|

- 内容可能为空值。

将数据写入sqlite数据库,数据库文件为 ./uae_contacts.db
在数据库中, 数据格式将转变为：
contacts: | id | url_phone | url | has_whatsApp | remarks | email | social_media | contact_remarks | other_remarks | Updated |
company:  | id | contacts_id | map_coordinate | company_name | industry | phone | address | country | 
"""
import pandas as pd
import os
import sys
from pathlib import Path

# 添加src目录到Python路径
src_path = Path(__file__).parent.parent / 'src'
sys.path.insert(0, str(src_path))

from utils.logger import logger

def read_excel_file(file_path):
    """读取Excel文件所有sheets并替换header，加入新的column, 返回一个DataFrame"""
    try:
        if not os.path.exists(file_path):
            logger.error(f"❌ 文件不存在: {file_path}")
            return None
        
        # 读取Excel文件的所有sheet
        excel_file = pd.ExcelFile(file_path)
        logger.info(f"发现 {len(excel_file.sheet_names)} 个工作表: {excel_file.sheet_names}")
        
        all_dataframes = []
        
        for sheet_name in excel_file.sheet_names:
            logger.info(f"正在处理工作表: {sheet_name}")
            
            # 读取每个sheet
            df_sheet = pd.read_excel(file_path, sheet_name=sheet_name)
            
            # 原始列名映射到新的列名
            column_mapping = {
                '地图坐标': 'map_coordinate',
                '公司名称': 'company_name', 
                '行业': 'industry',
                '地址': 'address',
                '电话': 'phone',
                '网址': 'url',
                '国家': 'country',
                '是否有WhatsApp': 'has_whatsapp',
                '备注': 'remarks'
            }
            
            # 重命名列
            df_sheet = df_sheet.rename(columns=column_mapping)
            
            # 添加新的列，初始值为空
            df_sheet['url_phone'] = None
            df_sheet['email'] = None
            df_sheet['social_media'] = None
            df_sheet['contact_remarks'] = None
            df_sheet['other_remarks'] = None
            
            # 处理空值，将NaN转换为None
            df_sheet = df_sheet.where(pd.notnull(df_sheet), None)
            
            # 特别处理字符串字段，确保NaN被转换为None而不是保留为float
            string_columns = ['map_coordinate', 'company_name', 'industry', 'address', 
                            'phone', 'url', 'country', 'has_whatsapp', 'remarks',
                            'email', 'social_media', 'contact_remarks', 'other_remarks']
            for col in string_columns:
                if col in df_sheet.columns:
                    df_sheet[col] = df_sheet[col].astype('object')
                    df_sheet[col] = df_sheet[col].where(pd.notnull(df_sheet[col]), None)
            
            # 添加到列表中
            all_dataframes.append(df_sheet)
            logger.info(f"工作表 {sheet_name} 处理完成，共 {len(df_sheet)} 行数据")
        
        # 合并所有DataFrame
        if all_dataframes:
            df = pd.concat(all_dataframes, ignore_index=True)
            logger.info(f"所有工作表合并完成，总共 {len(df)} 行数据")
            
            # 确保所有必需的列都存在
            required_columns = [
                'map_coordinate', 'company_name', 'industry', 'address', 
                'phone', 'url', 'country', 'has_whatsapp', 'remarks',
                'email', 'social_media', 'contact_remarks', 'other_remarks'
            ]
            
            for col in required_columns:
                if col not in df.columns:
                    df[col] = None
            
            # 只保留需要的列
            df = df[required_columns]
            
            return df
        else:
            logger.warning(f"⚠️ 没有找到任何数据")
            return None
            
    except Exception as e:
        logger.error(f"❌ 读取文件 {file_path} 时出错: {e}")
        return None


def write_to_sqlite(df, db_path, table_name='contacts'):
    """将DataFrame写入SQLite数据库（双表结构：Contact + Company）"""
    try:
        if df is None or df.empty:
            logger.warning(f"⚠️ 没有数据需要写入数据库")
            return None
        
        # 导入数据库工具类
        from db_helpler import DatabaseHelper
        
        # 创建数据库助手实例
        db_helper = DatabaseHelper(db_path)
        
        # 将DataFrame转换为字典列表
        contacts_data = df.to_dict('records')
        
        logger.info(f"准备写入 {len(contacts_data)} 条数据到数据库 {db_path}")
        
        # 批量插入数据（返回详细统计信息）
        result = db_helper.insert_contacts(contacts_data)
        
        # 获取数据库中的总记录数
        total_counts = db_helper.get_total_counts()
        
        logger.info(f"数据写入完成:")
        logger.info(f"  Contact表: 新增{result['contact_inserted']}条，更新{result['contact_updated']}条")
        logger.info(f"  Company表: 新增{result['company_inserted']}条")
        logger.info(f"  数据库总计: Contact表{total_counts['contacts']}条，Company表{total_counts['companies']}条")
        
        # 关闭数据库连接
        db_helper.close()
        
        return result
        
    except Exception as e:
        logger.error(f"❌ 写入数据库 {db_path} 时出错: {e}")
        return None


def main():
    """主函数：执行完整的数据导入流程"""
    try:
        # 配置文件路径
        excel_file_path = './files/中东.xlsx'
        db_file_path = './uae_contacts.db'
        
        logger.info("开始执行数据导入流程")
        logger.info(f"Excel文件路径: {excel_file_path}")
        logger.info(f"数据库文件路径: {db_file_path}")
        
        # 步骤1: 读取Excel文件
        logger.info("步骤1: 读取Excel文件")
        df = read_excel_file(excel_file_path)
        
        if df is None:
            logger.error(f"❌ 读取Excel文件失败，程序终止")
            return False
        
        logger.info(f"成功读取Excel文件，共 {len(df)} 行数据")
        
        # 显示数据预览
        logger.info("数据预览:")
        logger.info(f"列名: {list(df.columns)}")
        if len(df) > 0:
            logger.info(f"第一行数据示例: {df.iloc[0].to_dict()}")
        
        # 步骤2: 写入SQLite数据库
        logger.info("步骤2: 写入SQLite数据库")
        result = write_to_sqlite(df, db_file_path)
        
        if result is None:
            logger.error(f"❌ 写入数据库失败，程序终止")
            return False
        
        # 计算总处理记录数
        total_processed = result['contact_inserted'] + result['contact_updated'] + result['company_inserted']
        logger.info(f"数据导入完成！总共处理 {total_processed} 条记录")
        logger.info(f"  Contact表: 新增{result['contact_inserted']}条，更新{result['contact_updated']}条")
        logger.info(f"  Company表: 新增{result['company_inserted']}条")
        return True
        
    except Exception as e:
        logger.error(f"❌ 主程序执行出错: {e}")
        return False


if __name__ == '__main__':
    """命令行入口"""
    import sys
    
    # 清理旧日志
    from utils.logger import cleanup_old_logs
    cleanup_old_logs()
    
    logger.info("=" * 50)
    logger.info("UAE联系人数据导入程序启动")
    logger.info("=" * 50)
    
    success = main()
    
    if success:
        logger.info("程序执行成功完成")
        sys.exit(0)
    else:
        logger.error(f"❌ 程序执行失败")
        sys.exit(1)